package com.krediti.session;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.framework.EntityHome;

import com.krediti.entity.Korisnik;
import com.krediti.entity.KreditniZahtev;
import com.krediti.entity.Namena;
import com.krediti.entity.Status;
import com.krediti.entity.StatusZahteva;
import com.krediti.entity.TipRocnosti;
import com.krediti.entity.UgovorOKreditu;
import com.krediti.entity.Valuta;

@Name("kreditniZahtevHome")
public class KreditniZahtevHome extends EntityHome<KreditniZahtev> {

	/**
	 * Generated serial version.
	 */
	private static final long serialVersionUID = 6892979212787772460L;
	@In(create = true)
	KorisnikHome korisnikHome;
	@In(create = true)
	NamenaHome namenaHome;
	@In(create = true)
	StatusHome statusHome;
	@In(create = true)
	TipRocnostiHome tipRocnostiHome;
	@In(create = true)
	ValutaHome valutaHome;

	@In(create = true)
	StatusZahtevaHome statusZahtevaHome;

	StatusZahteva statusZahteva;
	

	@In(value = "ulogovaniKorisnik", scope = ScopeType.SESSION, required = false)
	Korisnik korisnik;

	private Status status;

	public void setKreditniZahtevId(Integer id) {
		setId(id);
	}

	public Integer getKreditniZahtevId() {
		return (Integer) getId();
	}

	@Override
	protected KreditniZahtev createInstance() {
		KreditniZahtev kreditniZahtev = new KreditniZahtev();
		return kreditniZahtev;
	}

	public void wire() {
		getInstance();

		getInstance().setKorisnik(korisnik);

		Namena namena = namenaHome.getDefinedInstance();
		if (namena != null) {
			getInstance().setNamena(namena);
		}
		setStatus( statusHome.findInitialStatus());
		if (getStatus() != null) {
			getInstance().setStatus(status);
		}
		if(getInstance()!=null)
			getInstance().setIznosRate(izracunajRatu());
		TipRocnosti tipRocnosti = tipRocnostiHome.getDefinedInstance();
		if (tipRocnosti != null) {
			getInstance().setTipRocnosti(tipRocnosti);
		}
		Valuta valuta = valutaHome.getDefinedInstance();
		if (valuta != null) {
			getInstance().setValuta(valuta);
		}
		java.sql.Date date = new java.sql.Date(System.currentTimeMillis());
		getInstance().setDatumZahteva(date);
		if(getInstance()!=null && getInstance().getId()!=null){
			getInstance().setBrojZahteva(kreirajBrojZahteva());
		}
	}


	public Integer kreirajBrojZahteva() {
		//TODO Trivijalan algoritam. U praksi je drugacije.
		return getInstance().getId()*100;
	}

	//TODO Trivijalan algoritam za potrebe rada. U praksi je drugacije. Ovde je ukljucena i kamata.
	public BigDecimal izracunajRatu() {
		BigDecimal rata = new BigDecimal(0);
		Integer rok = null;
		if(getInstance().getIznos()!=null && getInstance().getIznosUcesca()!=null && getInstance().getRok()!=null){

			BigDecimal iznosKredita = getInstance().getIznos();
			BigDecimal iznosUcesca = getInstance().getIznosUcesca();
			rok = getInstance().getRok();
			rata = (iznosKredita.subtract(iznosUcesca)).divide(new BigDecimal(rok.intValue()));
		}

		

		return rata;
	}

	/**
	 * It is necesary to insert initial status in order to make history.
	 * 
	 */
	@Override
	public String persist() {
		super.persist();

		saveStatusZahteva();
		return "persisted";
	}

	public boolean isWired() {
		return true;
	}

	public KreditniZahtev getDefinedInstance() {

		return isIdDefined() ? getInstance() : null;
	}

//	public List<UgovorOKreditu> getUgovorOKreditu() {
//		return getInstance() == null ? null : new ArrayList<UgovorOKreditu>(
//				getInstance().getUgovorOKreditu());
//	}

	public StatusZahteva getStatusZahteva() {
		return statusZahtevaHome.createInstance();
	}

	/**
	 * Inserts new initial entity StatusZahteva.
	 * 
	 * @return Status
	 */
	public boolean saveStatusZahteva() {

		
		if(isFilledDataInStatusZahteva()){
			getEntityManager().persist(statusZahteva);
			return true;
		}
		
		return false;
	}

	public boolean isFilledDataInStatusZahteva() {
		SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");

		statusZahteva = getStatusZahteva();
		statusZahteva.setDatum(sdf.format(new Date()));

		statusZahteva.setStatus(getStatus());
		statusZahteva.setKreditniZahtev(getInstance());

		if (statusZahteva.getStatus() != null
				&& statusZahteva.getKreditniZahtev() != null)
			return true;

		return false;
	}

	public Status getStatus() {
		return status;
	}

	public void setStatus(Status status) {
		this.status = status;
	}
	
	

}
